package com.swak.job.queue;

import java.util.concurrent.CompletableFuture;
import java.util.function.Function;

import com.swak.Constants;
import com.swak.job.JobConstants;
import com.swak.job.enums.Role;
import com.swak.registry.URL;
import com.swak.utils.StringUtils;

/**
 * 提供的队列服务
 * 
 * @author lifeng
 * @date 2021年2月25日 下午3:29:08
 */
public interface QueueService extends JobConstants {

	/**
	 * 解析队列
	 * 
	 * @param url
	 * @return
	 */
	default String parseQueue(Role role, URL url) {
		if (role == Role.Dispatcher) {
			return this.parseDispatchQueue(url);
		}
		return this.parseExecuteQueue(url);
	}

	/**
	 * 服务调用的解决方案：
	 * Job.Module.WechatJob -> 隔离模式、分组模式、默认模式
	 * 
	 * @param url
	 * @return
	 */
	default String parseDispatchQueue(URL url) {

		// 默认：Job.Module.WechatJob.D;
		String queue = url.toServicePath() + Constants.PATH_SEPARATE + Dispatch_QueueMake;

		// 删除前面的 "/"
		queue = StringUtils.substring(queue, 1);

		// 将 "/" 转为 "."
		return StringUtils.replace(queue, Constants.PATH_SEPARATE, Constants.MODULE_SEPARATE);
	}

	/**
	 * 服务调用的解决方案：
	 * Job.Module.WechatJob -> 隔离模式、分组模式、默认模式
	 * 
	 * @param url
	 * @return
	 */
	default String parseExecuteQueue(URL url) {

		String queue = null;

		// 隔离：Job.Module.WechatJob.E.192.168.0.110.com.xxxx.WechatJob
		if (url.getParameter(Isolate_key, false)) {
			queue = url.toServicePath() + Constants.PATH_SEPARATE + Execute_QueueMake + Constants.PATH_SEPARATE
					+ url.getHost() + Constants.PATH_SEPARATE + url.getParameter(Worker_key);
		}

		// 分组：Job.Module.WechatJob.E.GroupName
		else if (StringUtils.isNotBlank(url.getParameter(Group_key))) {
			queue = url.toServicePath() + Constants.PATH_SEPARATE + Execute_QueueMake + Constants.PATH_SEPARATE
					+ url.getParameter(Group_key);
		}

		// 默认：Job.Module.WechatJob.E;//.com.xxxx.WechatJob
		else {
			queue = url.toServicePath() + Constants.PATH_SEPARATE + Execute_QueueMake;// + Constants.PATH_SEPARATE + url.getParameter(Worker_key);
		}

		// 删除前面的 "/"
		queue = StringUtils.substring(queue, 1);

		// 将 "/" 转为 "."
		return StringUtils.replace(queue, Constants.PATH_SEPARATE, Constants.MODULE_SEPARATE);
	}

	/**
	 * 创建队列
	 * 
	 * @param queue
	 */
	void createQueue(String queue);

	/**
	 * 发布消息
	 * 
	 * @param queue
	 */
	void publishQueue(String queue, Object task);

	/**
	 * 发布消息
	 * 
	 * @param queue
	 */
	CompletableFuture<Void> publishQueueAsync(String queue, Object task);

	/**
	 * 添加消费
	 * 
	 * @param queue
	 */
	void consumeQueue(String queue, Function<Object, Object> func);

	/**
	 * 取消消费者
	 * 
	 * @param queue
	 * @param func
	 */
	void unconsumeQueue(String queue, Function<Object, Object> func);
}
